import unittest

class TestHashing(object):

    def test_hash(self):
        for (obj_1, obj_2,) in self.eq_pairs:
            try:
                if not (hash(obj_1) == hash(obj_2)):
                    self.fail(('%r and %r do not hash equal' % (obj_1, obj_2)))
            except KeyboardInterrupt:
                raise 
            except Exception, e:
                self.fail(('Problem hashing %r and %r: %s' % (obj_1,
                 obj_2,
                 e)))

        for (obj_1, obj_2,) in self.ne_pairs:
            try:
                if (hash(obj_1) == hash(obj_2)):
                    self.fail(("%s and %s hash equal, but shouldn't" % (obj_1, obj_2)))
            except KeyboardInterrupt:
                raise 
            except Exception, e:
                self.fail(('Problem hashing %s and %s: %s' % (obj_1,
                 obj_2,
                 e)))





class TestEquality(object):

    def test_eq(self):
        for (obj_1, obj_2,) in self.eq_pairs:
            self.assertEqual(obj_1, obj_2)
            self.assertEqual(obj_2, obj_1)




    def test_ne(self):
        for (obj_1, obj_2,) in self.ne_pairs:
            self.assertNotEqual(obj_1, obj_2)
            self.assertNotEqual(obj_2, obj_1)





class LoggingResult(unittest.TestResult):

    def __init__(self, log):
        self._events = log
        super(LoggingResult, self).__init__()



    def startTest(self, test):
        self._events.append('startTest')
        super(LoggingResult, self).startTest(test)



    def startTestRun(self):
        self._events.append('startTestRun')
        super(LoggingResult, self).startTestRun()



    def stopTest(self, test):
        self._events.append('stopTest')
        super(LoggingResult, self).stopTest(test)



    def stopTestRun(self):
        self._events.append('stopTestRun')
        super(LoggingResult, self).stopTestRun()



    def addFailure(self, *args):
        self._events.append('addFailure')
        super(LoggingResult, self).addFailure(*args)



    def addSuccess(self, *args):
        self._events.append('addSuccess')
        super(LoggingResult, self).addSuccess(*args)



    def addError(self, *args):
        self._events.append('addError')
        super(LoggingResult, self).addError(*args)



    def addSkip(self, *args):
        self._events.append('addSkip')
        super(LoggingResult, self).addSkip(*args)



    def addExpectedFailure(self, *args):
        self._events.append('addExpectedFailure')
        super(LoggingResult, self).addExpectedFailure(*args)



    def addUnexpectedSuccess(self, *args):
        self._events.append('addUnexpectedSuccess')
        super(LoggingResult, self).addUnexpectedSuccess(*args)




class ResultWithNoStartTestRunStopTestRun(object):

    def __init__(self):
        self.failures = []
        self.errors = []
        self.testsRun = 0
        self.skipped = []
        self.expectedFailures = []
        self.unexpectedSuccesses = []
        self.shouldStop = False



    def startTest(self, test):
        return 



    def stopTest(self, test):
        return 



    def addError(self, test):
        return 



    def addFailure(self, test):
        return 



    def addSuccess(self, test):
        return 



    def wasSuccessful(self):
        return True




